package network;

import java.io.IOException;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JLabel;
import javax.swing.JMenuItem;

import data.Authentification;
import data.Chrono;
import data.Log;
import data.ModeleAuthentification;
import data.ModeleChrono;
import data.ModeleChronoChecker;
import data.ModeleDynamiqueObjetAlerte;
import database.ConnexionDB;

public class ModeleConnexion implements Observer{

	private ConnexionDB DB;
	private ModeleAuthentification mauth;
	private Authentification auth;
	private ModeleChrono mchrono;
	private ModeleChronoChecker mchronochecker;
	private Chrono chronopartie;
	private JLabel lblChrono;
	private JMenuItem mntmSeConnecter;
	private JMenuItem mntmSeDconnecter;
	private Log log;
	ModeleDynamiqueObjetAlerte mdoa;
	
	public ModeleConnexion(Authentification auth, ConnexionDB DB, Chrono chronopartie, 
			JLabel lblChrono, JMenuItem mntmSeConnecter, JMenuItem mntmSeDconnecter,ModeleDynamiqueObjetAlerte mdoa, Log log){
		this.auth = auth;
		this.chronopartie = chronopartie;
		this.lblChrono = lblChrono;
		this.mntmSeConnecter = mntmSeConnecter;
		this.mntmSeDconnecter = mntmSeDconnecter;
		this.DB =DB;
		this.log = log;
		this.mdoa = mdoa;
	}
	public void update(Observable arg0, Object arg1) {
		Connexion c = (Connexion) arg0;
		if(c.getState()){
			/** Si on est connecté */
			//log.addLine("[+] Connexion:reussi, ip:127.0.0.1 port:8000");
			
			/** ici on fixe les observers / senders qui marche tout seul */
				// le sender d'authentification
				
				mauth = new ModeleAuthentification(c,DB, log);
				auth.deleteObservers();
				auth.addObserver(mauth);
				
				// le sender de chrono
				mchrono = new ModeleChrono(lblChrono,c,DB);
				chronopartie.deleteObservers();
				chronopartie.addObserver(mchrono);
				
				
				// TODO le sender d'alerte
				mchronochecker = new ModeleChronoChecker(auth, c, mdoa);
				chronopartie.addObserver(mchronochecker);
				
				// TODO le sender d'indices
			
			/** ici on fixe les trucs qui change quand on est connecté */
				// On modifie le menu
				mntmSeConnecter.setEnabled(false);
				mntmSeDconnecter.setEnabled(true);
			
				// On dit au client qu'il est anonyme pour le moment
				auth.setAnon();
				
				log.addLine("[+] Connecté au client");
			
		}
		else {
			/** si on est deconnecté */
			//log.addLine("[+] Deconnexion:reussi");
			
			/* Changement menu */
			mntmSeConnecter.setEnabled(true);
			mntmSeDconnecter.setEnabled(false);
			
			/* On enleve les observeurs */
			auth.deleteObservers();
			chronopartie.deleteObservers();
			
			log.addLine("[!] Deconnecté du client");
			
		}
	}
}
